05/10/20
Paul Hockett
*** Preliminary results.
Basic analysis of N2O ePolyScat results for core ionization events, O(1s) and N(1s). For backgound and methods, see ePSdata overview, ePSdata methods and ePS/ePSproc tutorial docs.
Pt 1: analysis of basic photoionization properties and matrix elements.
Pt 2: angle-resolved observables (this doc).
To do list:
!hostname
!conda env list
import sys
import os
from pathlib import Path
import numpy as np
# import epsproc as ep
import xarray as xr
from datetime import datetime as dt
timeString = dt.now()
# For module testing, include path to module here, otherwise use global installation
if sys.platform == "win32":
modPath = r'D:\code\github\ePSproc' # Win test machine
winFlag = True
else:
modPath = r'/home/femtolab/github/ePSproc/' # Linux test machine
winFlag = False
sys.path.append(modPath)
import epsproc as ep
# # TODO: tidy this up!
# from epsproc.util import matEleSelector
# from epsproc.geomFunc import geomCalc, geomUtils
# from epsproc.geomFunc.lfblmGeom import lfblmXprod
# Plotters
from epsproc.plot import hvPlotters
# Multijob class dev code
from epsproc.classes.multiJob import ePSmultiJob
hvPlotters.setPlotters()
# import bokeh
# import holoviews as hv
# hv.extension('bokeh')
# # Scan for subdirs, based on existing routine in getFiles()
fileBase = r'D:\VMs\Share\ePSshare\N2O\N20_wf' # Test dir on Stimpy (Win machine)
N2Odata = ePSmultiJob(fileBase, verbose = 0)
keys = [0,1,2] # Set for 1s datasets only (ugly!)
N2Odata.scanFiles(keys = keys)
N2Odata.jobsSummary()
Here orbitals 1,2,3 are all core 1s orbitals, centred on:
N2Odata.molSummary()
# Quick manual fix for orb/job labels
N2Odata.jobLabel(key=1, lString = "(central)")
N2Odata.jobLabel(key=2, lString = "(terminal)")
Making use of the raw matrix elements, the MFPADs can be plotted as a function of polarization geometry. Here are the results for a few energy slices, and each ionization channel, in polar and cart forms to give an overview.
The polarization geometries correspond to the laser field polarization aligned with the (x,y,z) molecular axes, as shown above. Note that the z-pol ('parallel') case is cylindrically symmetric, but not up-down symmetric. The (x,y) cases ('perpendicular') are not cylindrically symmetric.
NOTE: it seems like Plotly won't do more than ~12 subplots here, reasons TBD, so, for now, I've skipped the perpendicular N(1s) MFPADs here, since they show little energy dependence.
# Compute (numerical version without BLM computation)
N2Odata.mfpadNumeric()
# Set data ranges
Erange=[560, 620, 10]
Etype = 'Ehv'
# Set key for job
keys = 0
# MFPAD spherical polar plots with Plotly (interactive)
# Note x and y pol geoms are identical apart from rotation, so only x is plotted here.
N2Odata.mfpadPlot(Etype = Etype, Erange = Erange, selDims = {'Labels':['z','x']}, keys = keys, backend = 'pl')
# Gridded surface plots
N2Odata.mfpadPlot(Etype = Etype, Erange = Erange, pStyle='grid', keys = keys, backend = 'mpl')
# Set key for job
keys = 1
# MFPAD spherical polar plots with Plotly (interactive)
# Note x and y pol geoms are identical apart from rotation, so only x is plotted here.
N2Odata.mfpadPlot(Etype = Etype, Erange = Erange, selDims = {'Labels':['z']}, keys = keys, backend = 'pl')
# Gridded surface plots
N2Odata.mfpadPlot(Etype = Etype, Erange = Erange, pStyle='grid', keys = keys, backend = 'mpl')
# Set key for job
keys = 2
# MFPAD spherical polar plots with Plotly (interactive)
# Note x and y pol geoms are identical apart from rotation, so only x is plotted here.
N2Odata.mfpadPlot(Etype = Etype, Erange = Erange, selDims = {'Labels':['z']}, keys = keys, backend = 'pl')
# Gridded surface plots
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, pStyle='grid', keys = keys, backend = 'mpl')
Angle-dependence vs. E plots. By dropping the (sort-of) redundant $\phi$ coord, one can generate $(E,\theta)$ maps which show the main trends. Here each channel is plotted for cross-section and phase.
selDims = {'Phi':0, 'Labels':['z','x']}
Erange = Erange[0:2] # Reset for full resolution
keys = 0
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'a', pStyle='grid', backend = 'mpl')
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'phase', pStyle='grid', backend = 'mpl')
keys = 1
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'a', pStyle='grid', backend = 'mpl')
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'phase', pStyle='grid', backend = 'mpl')
keys = 2
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'a', pStyle='grid', backend = 'mpl')
N2Odata.mfpadPlot(Etype = 'Ehv', Erange = Erange, selDims = selDims, keys = keys, pType = 'phase', pStyle='grid', backend = 'mpl')
import scooby
scooby.Report(additional=['epsproc', 'xarray', 'jupyter'])